# -*- coding: utf-8 -*-
# @Time    : 2024/7/11 10:18
# @Author  : yujiahao
# @File    : 12_fastapi_uuid.py
# @description:额外的数据类型


'''
除了常用的基本数据类型之外还有一些可以使用的其他数据类型:

    UUID:
        一种标准的 "通用唯一标识符" ，在许多数据库和系统中用作ID。
        在请求和响应中将以 str 表示。
    datetime.datetime:
        一个 Python datetime.datetime.
        在请求和响应中将表示为 ISO 8601 格式的 str ，比如: 2008-09-15T15:53:00+05:00.
    datetime.date:
        Python datetime.date.
        在请求和响应中将表示为 ISO 8601 格式的 str ，比如: 2008-09-15.
    datetime.time:
        一个 Python datetime.time.
        在请求和响应中将表示为 ISO 8601 格式的 str ，比如: 14:23:55.003.
    datetime.timedelta:
        一个 Python datetime.timedelta.
        在请求和响应中将表示为 float 代表总秒数。
        Pydantic 也允许将其表示为 "ISO 8601 时间差异编码", 查看文档了解更多信息。
    frozenset:
        在请求和响应中，作为 set 对待：
        在请求中，列表将被读取，消除重复，并将其转换为一个 set。
        在响应中 set 将被转换为 list 。
        产生的模式将指定那些 set 的值是唯一的 (使用 JSON 模式的 uniqueItems)。
    bytes:
        标准的 Python bytes。
        在请求和响应中被当作 str 处理。
        生成的模式将指定这个 str 是 binary "格式"。
    Decimal:
        标准的 Python Decimal。
        在请求和响应中被当做 float 一样处理。

可以在这里检查所有有效的pydantic数据类型:https://docs.pydantic.dev/latest/concepts/types/

'''
import uuid
from datetime import datetime, time, timedelta
from typing import Annotated
from uuid import UUID

from fastapi import Body, FastAPI

app = FastAPI()


@app.put("/items/{item_id}")
async def read_items(
        item_id: UUID,
        start_datetime: Annotated[datetime, Body()],
        end_datetime: Annotated[datetime, Body()],
        process_after: Annotated[timedelta, Body()],
        repeat_at: Annotated[time | None, Body()] = None,
):
    # 执行正常的日期操作
    start_process = start_datetime + process_after
    duration = end_datetime - start_process
    # 这里单独生成一个uuid
    '''
    UUID 的标准格式是 8-4-4-4-12 的十六进制字符串，中间用连字符连接，例如：123e4567-e89b-12d3-a456-426614174000
    UUID1：基于时间戳和节点（MAC 地址），适用于需要唯一性但不介意暴露节点信息的场景。
    UUID2：类似于 UUID1，但包含 POSIX UID/GID，不常用。
    UUID3：基于命名空间和名称的 MD5 哈希，适用于需要确定性 UUID 的场景。
    UUID4：基于随机数，适用于需要完全随机且唯一的 UUID。
    UUID5：基于命名空间和名称的 SHA-1 哈希，适用于需要确定性且更安全的 UUID。
    '''
    uuid1 = uuid.uuid1()

    return {
        "item_id": item_id,
        "start_datetime": start_datetime,
        "end_datetime": end_datetime,
        "process_after": process_after,
        "repeat_at": repeat_at,
        "start_process": start_process,
        "duration": duration,
        "new_uuid": uuid1
    }
